generic関数宣言内のVariadic Tuple Types
前提条件
genericな関数に型をつけるときに使える
型引数には、arrayかtupleの制約が入っている必要がある
XS extends unknown[]
XS extends readonly unknown[]
code:例.ts
declare function hoge<XS extends unknown[]>(
): ...
どう変わるのか
上の前提条件を満たしているときに、[...XS]と書くと、
XSが、配列型ではなく、Tuple型として推論される
XSと[...XS]で意味が変わるの難しすぎない?mrsekut.icon
意味が変わっている例
普通にただのXSと書いた時、
code:ts
const fn = <XS extends readonly unknown[]>(arr: XS): XS => arr
const hoge = fn('foo', 1); // (string|number)[] 返り値は、['foo',1]だが、(string|number)[]と推論される
[...XS]と書いた時
code:ts
const fn = <XS extends readonly unknown[]>(arr: ...XS): XS => arr; 返り値は、[string,number]と推論される
実際に使っている例
tupleに対するindex accessに対する推論
ちょっとだけ中心機能とズレている話だけど、これもすごいなmrsekut.icon
code:ts
function head<T extends readonly any[]>(args: readonly ...T) { return result;
}
tupleでないと、効能は薄れるが、
code:ts
function head<T extends readonly any[]>(args: ...T) { return result;
}
tupleじゃないと、[1, 'bar']なんてリストは作らないので、結局tuple使う時に嬉しい、という話だなmrsekut.icon
参考